Hyper-V上にBoot2DockerをインストールしてMacからつないでみた
はじめに
好物はインフラとフロントエンドのかじわらゆたかです。
とある案件でDockerを使った環境を使う機会があり、
自宅のMacbook Airにも環境を作ろうとしたらこの仕打ち。
いや、我が家にはWindows 8.1機がある。
Windows 8.1にはHyper-Vが導入できる。
Hyper-V上でBoot2Docker動かしてMacから繋いでみれば良いのでは?
といった経緯で環境を構築してみました。
構成図
Windows 8.1(Hyper-V)上にゲストOSとしてBoot2Dockerを導入し、
Macから操作すると言った流れになります。
Docker-Machineを用いて作成する事もできそうなのですが、
自分の環境ではうまく行きませんでした。
そのため、今回は手動で構築していきます。
Boot2Dockerの導入
Hyper-V 導入
Windows 8.1へのHyper-Vの導入は省略します。
マシンのCPU要件さえ満たしていれば導入は問題なく行えるはずです。
クライアント Hyper-V を使用して Windows 8 で仮想マシンを実行する - Windows ヘルプ
仮想スイッチの作成
外部ネットワークを接続先とするスイッチを作成しておきます。
ゲストOS作成
仮想マシンの新規作成ウィザードにそって進めていきます。
- 仮想マシンの世代は第1世代とします。
- メモリに関しては任意に割り当ててください。 起動するコンテナ数に応じてって事になるかと思います。
- 仮想HDDの形式はVHDはVHDX形式で問題ありません。
- ネットワークは先ほど作成した仮想スイッチを使います。
- ディスクイメージとしてBoot2DockerのISOイメージを選択します。
ここまでできた段階で起動します。
起動さえしてしまえばMac上からSSHでつないで以下の作業は実施可能です。
なお、秘密鍵を用いない場合の接続情報は以下のようになります。
ユーザー名 docker
パスワード tcuser
パーテーションの作成・フォーマットの実施
Boot2Dockerはboot2docker-dataといったラベルがついている
ext4かbtrfsでフォーマットされたパーテションを自動でマウントするとのことなので、
そういったパーテーションの作成・フォーマットを実施していきます。
以下に私がやった例を載せておきます。
パーテーション作成
docker@boot2docker:~$ sudo fdisk /dev/sda Device contains neither a valid DOS partition table, nor Sun, SGI, OSF or GPT disklabel Building a new DOS disklabel. Changes will remain in memory only, until you decide to write them. After that the previous content won't be recoverable. The number of cylinders for this disk is set to 16578. There is nothing wrong with that, but this is larger than 1024, and could in certain setups cause problems with: 1) software that runs at boot time (e.g., old versions of LILO) 2) booting and partitioning software from other OSs (e.g., DOS FDISK, OS/2 FDISK) Command (m for help): n Command action e extended p primary partition (1-4) p Partition number (1-4): 1 First cylinder (1-16578, default 1): Using default value 1 Last cylinder or +size or +sizeM or +sizeK (1-16578, default 16578): Using default value 16578 Command (m for help): w The partition table has been altered. Calling ioctl() to re-read partition table
フォーマットの実施
docker@boot2docker:~$ sudo mkfs.ext4 -L boot2docker-data /dev/sda1 mke2fs 1.42.12 (29-Aug-2014) /dev/sda1 alignment is offset by 512 bytes. This may result in very poor performance, (re)-partitioning suggested. Discarding device blocks: done Creating filesystem with 33290688 4k blocks and 8323072 inodes Filesystem UUID: 58918b9f-5d25-4a0c-b875-0bb703d332a3 Superblock backups stored on blocks: 32768, 98304, 163840, 229376, 294912, 819200, 884736, 1605632, 2654208, 4096000, 7962624, 11239424, 20480000, 23887872 Allocating group tables: done Writing inode tables: done Creating journal (32768 blocks): done Writing superblocks and filesystem accounting information: done
なお、ここではマウントを実施していないため、一度再起動してマウントさせてます。
また、再起動した際に、公開鍵が再度作られているので、
sshでログインする場合は~/.ssh/known_hostの内容を消す等しておく必要があります。
/home/docker の永続化
上記でディスク領域を作成したので、作ったコンテナ等は保存されるのですが、
/home/dockerが起動するたびに消えてしまうので、永続化する必要があります。
docker@boot2docker:~$ sudo su - Boot2Docker version 1.8.1, build master : 7f12e95 - Thu Aug 13 03:24:56 UTC 2015 Docker version 1.8.1, build d12ea79 root@boot2docker:~# cat > /var/lib/boot2docker/bootlocal.sh <<EOF > echo "tar cf /var/lib/boot2docker/userdata.tar . -C /home/docker/" >> /opt/shutdown.sh > EOF root@boot2docker:~# chmod +x /var/lib/boot2docker/bootlocal.sh
なお、上記の設定はBoot2Docker起動時に、
Boot2Docker終了した際にuserdata.tarを作ると言った設定を行っているため、
一度再起動させておきます。
正しく設定できていれば/home/dockerにファイルを作成後、
Rebootしても問題なく復元されるはずです。
確認してみたいと思います。
docker@boot2docker:~$ touch fileRestoreCheck docker@boot2docker:~$ ls fileRestoreCheck docker@boot2docker:~$ sudo reboot 再起動実施後 docker@boot2docker:~$ ls fileRestoreCheck
ファイルが再起動後も配置されている事が確認できました。
秘密鍵の設定
様々な方法があるとは思いますが、
Docker上で秘密鍵・公開鍵を作成しMac側は作った秘密鍵を用います。
docker@boot2docker:~$ ssh-keygen -t ecdsa -b 521 Generating public/private ecdsa key pair. Enter file in which to save the key (/home/docker/.ssh/id_ecdsa): Created directory '/home/docker/.ssh'. Enter passphrase (empty for no passphrase): Enter same passphrase again: Your identification has been saved in /home/docker/.ssh/id_ecdsa. Your public key has been saved in /home/docker/.ssh/id_ecdsa.pub. The key fingerprint is: 50:37:1a:85:1c:79:97:7a:03:10:05:e4:5a:ab:77:9d docker@boot2docker The key's randomart image is: +--[ECDSA 521]---+ | oOX= . | | o++o.o | | . +. + | | + .. o | | . S . . | | . . . | | . . . E | | . . | | | +-----------------+ docker@boot2docker:~$ mv ./.ssh/id_ecdsa id_ecdsa id_ecdsa.pub docker@boot2docker:~$ mv ./.ssh/id_ecdsa.pub ./.ssh/authorized_keys docker@boot2docker:~$ chmod 600 ./.ssh/authorized_keys
Macからの接続
接続を行うMacはDocker Docker-machineの導入と、
OpenSSHの更新を行い、ECDSAでログインができる環境を前提とします。
なお、DockerとDocker-machineはHomebrewから導入が可能です。
OpenSSHの更新については下記のサイトを参考にしました。
How to Update OpenSSH on Mac OS X | Dctr Watson
Dockerの登録
先ほど作った秘密鍵を取得し、
取得した秘密鍵でdocker-machineからdockerの登録を行います。
$ scp docker@192.168.11.106:~/.ssh/id_ecdsa ./.ssh/docker_ecdsa $ docker-machine create -d generic --generic-ssh-user docker --generic-ssh-key ~/.ssh/docker_ecdsa --generic-ip-address 192.168.11.106 hyper-v $ eval "$(docker-machine env hyper-v)" $ docker version Client: Version: 1.8.1 API version: 1.20 Go version: go1.4.2 Git commit: d12ea79 Built: Thu Aug 13 19:45:58 UTC 2015 OS/Arch: darwin/amd64 Server: Version: 1.8.1 API version: 1.20 Go version: go1.4.2 Git commit: d12ea79 Built: Thu Aug 13 02:49:29 UTC 2015 OS/Arch: linux/amd64
Dockerコンテナの作成・アクセスの実施
コンテナの作成まで問題なく行えていれば、
以下でブラウザにNode-REDの画面が表示されます。
$ docker run –d –p 1880:1880 node-red $ docker-machine ip hyper-v 192.168.11.106 $ open http://192.168.11.106:18080
さいごに
Dockerのインストールまで行えてしまえば、
どこの環境に入っているかと言った事はほとんど意識する必要がなく使えます。
VirtualBoxの機能を用いたSharedFolderの機能が無い点は注意が必要です。
参考サイト
Getting Docker Running on Hyper-V 8.1/ 2012 R2 | CloudExpert Tackling your needs for success boot2dockerのデータ永続化まとめ - Qiita